[英]NSUrl from NSString?
Having a really hard time getting an NSString
into an NSURL
很难将NSString
转换为NSURL
NSURL *url = [NSURL URLWithString:@"http://.../social.php"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
for(id entry in JSON)
{
strTwitter= [entry valueForKeyPath:@"str1"];
strFacebook =[entry valueForKeyPath:@"str2"];
CCLOG(@"twitter: %@", strTwitter);
}
} failure:nil];
[operation start];
elsewhere...别处...
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: strTwitter]];
And then I crash on the NSURL
line with EXC_BAD_ACCESS
然后我在带有EXC_BAD_ACCESS
的NSURL
行上崩溃
In mainMenu.h
:在mainMenu.h
:
@interface mainMenuLayer : CCLayer
{
NSString *strTwitter;
}
CCLOG prints the URL fine - no spaces; CCLOG 打印 URL 很好——没有空格; has https, etc... ?有 https 等...?
.h 。H
#import "cocos2d.h"
#import "menuHome.h"
#import "menuMenu.h"
#import "AFJSONRequestOperation.h"
@interface mainMenuLayer : CCLayer
{
CCSprite *Background;
CCSprite *logoBackground;
CCSprite *logoName;
menuHome *theMenuHome1;
menuMenu *theMenuMenu1;
CGSize size;
CCMenu *bottomMenu;
CCMenu *bottomMenu2;
CCMenuItemImage *menuHouse;
CCMenuItemImage *menuMenu2;
CCMenuItemImage *menuPictures;
CCMenuItemImage *menuContact;
CCMenuItemImage *menuMore;
CCMenuItemImage *menuTemp;
CCMenuItemImage *menuTwitter;
CCMenuItemImage *menuFacebook;
CCMenuItemImage *menuWebsite;
CCMenuItemImage *menuAbout;
CCMenuItemImage *menuBlank;
NSString *strTwitter;
NSString *strFacebook;
NSInteger moreVisible;
}
// returns a CCScene that contains the HelloWorldLayer as the only child
+(CCScene *) scene;
-(void) funcHome;
-(void) funcMore;
-(void) funcMenu2;
+(mainMenuLayer*) sharedMenuScene;
@end
.m .m
#import "mainMenu.h"
#import "constants.h"
@interface mainMenuLayer ()
@property(nonatomic, strong) NSString *strTwitter;
@end
// HelloWorldLayer implementation
@implementation mainMenuLayer
@synthesize strTwitter;
static mainMenuLayer *sharedMenuScene;
+(mainMenuLayer*) sharedMenuScene {
NSAssert(sharedMenuScene != nil, @"not yet initilized");
return sharedMenuScene;
}
+(CCScene *) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
mainMenuLayer *layer = [mainMenuLayer node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
// on "init" you need to initialize your instance
-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super" return value
if( (self=[super init])) {
sharedMenuScene = self;
// create and initialize a Label
self.isTouchEnabled = YES;
[[CCDirector sharedDirector]enableRetinaDisplay:YES];
// ask director the the window size
size = [[CCDirector sharedDirector] winSize];
moreVisible = 0;
//theMenuHome1.position = ccp(0.0f, 0.0f);
logoBackground = [CCSprite spriteWithFile:@"logo_bg_640x120.png"];
[self addChild:logoBackground z: depthLevelMenu];
logoBackground.position = ccp( size.width / 2, size.height - 30);
logoName = [CCSprite spriteWithFile:@"res_name.png"];
[self addChild:logoName z: depthLevelMenuLogo];
logoName.position = ccp( size.width / 2, size.height - 30);
Background = [CCSprite spriteWithFile:@"background.png"];
[self addChild:Background z: depthLevelBackground];
Background.position = ccp( size.width / 2, size.height / 2);
menuHouse = [[CCMenuItemImage itemFromNormalImage:@"home_128x100_unselect.png" selectedImage:@"home_128x100_select.png" target:self selector:@selector(funcHome:)]retain];
menuHouse.position = ccp( 32, 25 );
menuContact = [[CCMenuItemImage itemFromNormalImage:@"contact_128x100_unselect.png" selectedImage:@"contact_128x100_select.png" target:self selector:@selector(funcHome:)]retain];
menuContact.position = ccp( 96, 25 );
menuMenu2 = [[CCMenuItemImage itemFromNormalImage:@"menu_128x100_unselect.png" selectedImage:@"menu_128x100_select.png" target:self selector:@selector(funcHome:)]retain];
menuMenu2.position = ccp( 160, 25 );
menuPictures = [[CCMenuItemImage itemFromNormalImage:@"photos_128x100_unselect.png" selectedImage:@"photos_128x100_select.png" target:self selector:@selector(funcHome:)]retain];
menuPictures.position = ccp( 224, 25 );
menuMore = [[CCMenuItemImage itemFromNormalImage:@"more_128x100_unselect.png" selectedImage:@"more_128x100_select.png" target:self selector:@selector(funcMore:)]retain];
menuMore.position = ccp( 288, 25 );
bottomMenu = [CCMenu menuWithItems: menuHouse, menuContact, menuMenu2, menuPictures, menuMore, nil];
bottomMenu.position = CGPointZero;
[self addChild: bottomMenu z:depthLevelMenu];
[menuHouse selected];
[self getSettings];
}
return self;
}
-(void) getSettings
{
NSURL *url = [NSURL URLWithString:@"http://.../social.php"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
for(id entry in JSON)
{
strTwitter= [entry valueForKeyPath:@"str1"];
strFacebook =[entry valueForKeyPath:@"str2"];
CCLOG(@"twitter: %@", strTwitter);
}
} failure:nil];
[operation start];
}
-(void) funcMenu2: (id) sender
{
CCLOG(@"funcMenu2 Called");
[menuTwitter unselected];
[menuFacebook unselected];
[menuWebsite unselected];
[menuAbout unselected];
[menuBlank unselected];
[menuMore unselected];
if(sender == menuTwitter)
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: strTwitter]];
CCLOG(@"url: %@", strTwitter);
CCLOG(@"Twitter Selected");
[sender selected];
}
}
How is strTwitter instantiated? strTwitter 是如何实例化的? Looks like it is being released prior to the看起来它是在
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: strTwitter]];
Statement陈述
Make a private property for strTwitter (put this inside your.m file:为 strTwitter 创建一个私有属性(把它放在你的 .m 文件中:
@interface mainMenuLayer ()
@property(nonatomic, strong) NSString *strTwitter;
@end
Then right below the @implementation mainMenuLayer
:然后在@implementation mainMenuLayer
的正下方:
@synthesize strTwitter;
One other note is that you should get in the habit of using proper case when defining classes: MainMenuLayer vs mainMenuLayer另一个注意事项是您应该养成在定义类时使用正确大小写的习惯:MainMenuLayer 与 mainMenuLayer
change "strTwitter= [entry valueForKeyPath:@"str1"];"更改“strTwitter= [entry valueForKeyPath:@"str1"];" to到
self.strTwitter= [entry valueForKeyPath:@"str1"]; self.strTwitter= [entry valueForKeyPath:@"str1"];
this will make sure it gets retained by the auto-generated setter.这将确保它被自动生成的设置器保留。 The way you are assigning strTwitter sidesteps the setter and just assigns the non-retained object to it.您分配 strTwitter 的方式避开了 setter,只是将非保留的 object 分配给它。 I make a habit of calling "self.{property} = {some value}" when assigning.我习惯在分配时调用“self.{property} = {some value}”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.