0

我在将字符串传递给另一个 UIViewController 然后打开这个 UIViewController 时遇到问题,这就是我所做的:

。H

#import <UIKit/UIKit.h>

@interface BroswerViewController : UIViewController

@property (retain, nonatomic) IBOutlet UIWebView *myBrowserView;
@property (nonatomic, retain) NSString * myString;
@end

.m

@implementation BroswerViewController
@synthesize myBrowserView;
@synthesize myString;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization

}
return self;
}

- (void)viewWillAppear:(BOOL)animated {

myString = [myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://mywebsite/%@",myString]];
NSLog(@"%@",url);
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[myBrowserView loadRequest:request];

}

我称之为类:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (!self.myBroserViewController) {
    self.myBroserViewController = [[[BroswerViewController alloc] initWithNibName:@"BroswerViewController" bundle:nil] autorelease];
}

[self.myBroserViewController setMyString:[NSString stringWithString:[stringArray objectAtIndex:indexPath.row]]];
[self.navigationController pushViewController:self.myBroserViewController animated:YES];
}

好的,所以我将一个字符串传递给 BrowseViewController 类,然后打开 browseviewcontroller 类并使用我传递的字符串打开 url,第一次总是工作,然后我返回并传递另一个字符串并打开视图和第二次随机工作,第三次永远不会,我总是在线收到 EXC_BAD_ACCESS

@synthesize myString;

我不知道我错了什么...

4

4 回答 4

3

self.myStringviewWillAppear:. _ 当您直接使用变量而不是属性表示法时,您不会获得保留属性的效果。

于 2012-05-12T00:42:02.017 回答
1

我会添加一些指向@Phillip Mills 答案的指针。

- 在您的初始化中,您应该将 myString 设置为 nil。这确保了如果它在被设置到其他地方之前被释放,它不会崩溃。包括如果您使用对其执行释放的设置器(您可以释放 nil 引用)。

- 在你的 dealloc 上,你应该释放 myString(除非你使用 ARC)。

-当您在 viewWillAppear 中设置它时,您需要执行以下操作:

self.myString = [self.myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

或者

NSString *temp = myString;
[myString release];
myString = [[temp stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] retain];

他们都完成了同样的事情。不过使用 self 更容易。

-最后,我会使用复制而不是保留,除非您有非常具体的理由使用保留。这可以确保其他东西不会改变你。

于 2012-05-12T01:01:19.977 回答
0

最佳实践告诉我们在这种情况下使用复制而不是保留。这就是为什么:

myString = [myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

也会更改初始字符串,下次您将其调用为已转义的字符串。这就是为什么你会出现这种奇怪的行为:)

解决方案 - 改变

@property (nonatomic, retain) NSString * myString;

@property (nonatomic, copy) NSString * myString;

使用

自我.myString

也会解决它,但这仍然不是一个好习惯......例如,如果您的方法如下所示:

NSURLRequest *request = [NSURLRequest requestWithURL:[self prepareUrl:self.myString]];

您仍然可以捕捉到非常奇怪且难以调试的工件。

于 2012-05-12T00:58:22.600 回答
0

在我的代码中,我在我的合成中更改了实例变量名称。

这是您的代码的样子

@implementation BroswerViewController
@synthesize myBrowserViewh = _myBrowserViewh;
@synthesize myString = _myString;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization

}
return self;
}

- (void)viewWillAppear:(BOOL)animated {

self.myString = [self.myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://mywebsite/%@",self.myString]];
NSLog(@"%@",url);
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[myBrowserView loadRequest:request];

}

那时你将被迫使用

self.myString = @"";

或通过引用实例变量

_myString = @"";

这将使编译器帮助您找到这样的错误。

于 2012-05-12T02:11:16.877 回答