相关疑难解决方法(0)

如何在Objective-C中的视图控制器之间传递对象?

我已经跋涉了两天的代码试图找出为什么我无法获取我在.h中声明并在.m中实现并在viewDidLoad函数中设置的全局NSMutableArray变量.

它终于明白了:在Ob​​jective-C中没有全局变量这样的东西,至少在我已经知道的PHP意义上是这样.我从来没有真正阅读过XCode错误警告,但即使不是很简单的英语也是如此:"在类方法中访问实例变量'blah'."

我的问题:我现在该怎么办?我有两个View Controller需要访问我通过URL从JSON文件生成的中央NSMutableDictionary.它基本上是我所有Table View钻取的扩展菜单,我想要其他几个"全局"(非静态)变量.

每次我想生成这个NSMutableDictionary时,我是否必须获取JSON,或者是否有某种方法可以设置它一次并通过#import从各种类访问它?我是否必须将数据写入文件,还是人们通常采用其他方式?

iphone xcode objective-c

5
推荐指数
1
解决办法
2万
查看次数

作为NSNotification观察员的类?

是否可以拥有静态NSNotification观察器(如下面的代码)?我遇到了一些问题,我认为这可能是由于我的单例类结构.

我并不总是有一个类实例来监听通知,但是这个类的静态属性仍然适用于我的应用程序的生命周期.

- (id)init {
    [super init]

    [[NSNotificationCenter defaultCenter] addObserver:[self class]
                                             selector:@selector(action:aNotification:)
                                                 name:@"NSSomeNotification"
                                               object:nil];
    return self;
}

+ (void)action:(NSNotification *)aNotification {
    NSLog( @"Performing action" );
}
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c nsnotifications nsnotification nsnotificationcenter

5
推荐指数
1
解决办法
2337
查看次数

在Interface Builder中使用Singleton?

我有一个像这样的Singleton设置:

static Universe *instance;

+ (Universe *)instance { return instance; }

+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        instance = [[Universe alloc] init];
    }
}

- (id) init
{
    self = [super init];
    if (self != nil) {
        self.showHistory = YES;
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

但现在我意识到我想从Interface Builder中实例化它.我正在考虑切入init这样的方法

    if (instance) 
         return instance;
Run Code Online (Sandbox Code Playgroud)

这是一个坏主意吗?我更喜欢IB来获取已经在+initialize方法中创建的实例.

objective-c

5
推荐指数
1
解决办法
1841
查看次数

Apple的样本MVCN网络中的Singleton类NetworkManager是否正确?

以下是示例代码的链接http://developer.apple.com/library/ios/#samplecode/MVCNetworking/Introduction/Intro.html

以下是NetworkManager.m文件中的代码段

+ (NetworkManager *)sharedManager
// See comment in header.
{
    static NetworkManager * sNetworkManager;

    // This can be called on any thread, so we synchronise.  We only do this in 
    // the sNetworkManager case because, once sNetworkManager goes non-nil, it can 
    // never go nil again.

    if (sNetworkManager == nil) {
        @synchronized (self) {
            sNetworkManager = [[NetworkManager alloc] init];
            assert(sNetworkManager != nil);
        }
    }
    return sNetworkManager;
}
Run Code Online (Sandbox Code Playgroud)

显然这里存在线程安全问题.当存在多个线程时,可以创建两个NetworkManager实例.所以Apple犯了一个错误,对吗?

objective-c ios

5
推荐指数
1
解决办法
1317
查看次数

Objective-C - 优化这种单例模式?

我在网上发现了单身人士模式.在我看来,它有许多可以优化的东西.

- 在sharedMySingleton方法中,不需要调用保留?我不确定...... -
如果不是,为什么还有保留allocWithZone
- 是什么用的@synchronized.NSAssert认为可以多次调用块,所以如果是的话,应该有更多的代码来释放先前的内存,或者在没有NSAsserting的情况下清楚地退出块,如果没有,为什么会出现这个NSAssert?
- 链子beetween sharedMySingletonalloc似乎很奇怪.我自己写了类似的东西:

+(MySingleton*)sharedMySingleton
{
    @synchronized([MySingleton class])
    {
        if (_sharedMySingleton == nil) _sharedMySingleton = [[self alloc] init];
        return _sharedMySingleton;
    }

    return nil;
}

+(id)alloc
{
    @synchronized([MySingleton class])
    {
        return [super alloc];
    }

    return nil;
} 
Run Code Online (Sandbox Code Playgroud)

单身模式

#import "MySingleton.h"

@implementation MySingleton

// ##########################################################################################################
// ######################################## SINGLETON PART ##################################################
// ##########################################################################################################
static MySingleton* _sharedMySingleton = nil;

// =================================================================================================
+(MySingleton*)sharedMySingleton
// =================================================================================================
{
    @synchronized([MySingleton class])
    {
        if …
Run Code Online (Sandbox Code Playgroud)

iphone singleton memory-management objective-c ios

5
推荐指数
1
解决办法
927
查看次数

创建Objective-C API

我从未在objective-c中创建过API,现在需要这样做."想法"是我构建了一个可以在其他应用程序中实现的API.很像Flurry,仅用于其他目的.启动API时,应输入用户名,密码和模式.该模式应该是LIVE或BETA(我想这应该是一个NSString(?)),然后应该没有[MyAPI doSomething:withThisObject];ect.

所以要开始吧 [MyAPI username:@"Username" password:@"Password" mode:@"BETA"];

任何人都可以帮我解决一些教程和指针,了解如何最好地学习它?

api objective-c ios

4
推荐指数
1
解决办法
2868
查看次数

"语句需要表达整数类型"错误,包含switch语句和字符串数组

尝试使用数组,但它在switch语句中给出了"语句需要表达整数类型('id'无效)".怎么了?

NSArray count = [NSArray arrayWithObjects: @"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];    

switch ([count objectAtIndex: myIndex]) {
    case 1:
        NSLog(@"One");
        break;
    case 2:
        NSLog(@"Two");
        break;
    case 3:
        NSLog(@"Three");
        break;
    default:
        break;
}
Run Code Online (Sandbox Code Playgroud)

iphone objective-c

4
推荐指数
1
解决办法
8644
查看次数

在Objective-C中初始化静态变量

在Objective-C类中,我想只将文本文件的内容加载到NSString中,以便该类的所有实例都可以使用它.

在Java世界中,我多年来了解到,如果你不使用经过验证的成语,就很容易在线程安全方面出现这种错误.所以我想确保使用正确的习语.

你能告诉我一个Objective-C类的例子吗?

这是我开始时的空课......

@interface TestClass : NSObject
- (NSString *)doSomething:(NSUInteger)aParam;
@end

@implementation TestClass {
}

- (id)init {
    self = [super init];
    if (self) {

    }
    return self;
}

- (NSString *)doSomething:(NSUInteger)aParam {
     // something with shared NSString loaded from text file, 
     //  depending on the value of aParam
     return @""; 
}
@end
Run Code Online (Sandbox Code Playgroud)

idioms objective-c

4
推荐指数
1
解决办法
151
查看次数

什么更好:编写函数或编写方法?什么成本更高?

目前我正在为我的第一个Objective-c API做出一些决定.没什么大不了的,只是帮助我自己将来更快地完成任务.

在阅读了几个小时关于不同模式,比如制作类别,单身等等之后,我遇到了一些我喜欢的东西,因为它对我来说似乎很容易维护.我正在制作一套有用的功能,这些功能在任何地方都很有用.

所以我做的是:

1)我创建了两个新文件(.h,.m),并为"class"命名:SLUtilsMath,SLUtilsGraphics,SLUtilsSound等.我认为这是一种"命名空间",所以所有这些东西总是被称为SLUtils******.我将它们全部添加到Group SL中,其中包含一个子组SLUtils.

2)然后我只将函数签名放在.h文件中,并在.m文件中实现函数.猜猜看:它有效!! 我很高兴它,它很容易使用.关于它的唯一令人讨厌的事情是,我每次需要时都必须包含适当的标题.但那没关系,因为那是正常的.不过,我可以将它包含在头文件前缀pch文件中.

然后,我去了厕所,一个幽灵出现在那里,说:"嘿!制作真正的方法而不是函数是不是更好?你不应该制作类方法,所以你必须调用一个方法而不是而不是一个功能?是不是更酷,是不是有更好的表现?" 好吧,为了便于阅读,我更喜欢这些功能.另一方面,他们没有像方法那样的"命名参数",afaik.

那么在那种情况下你更喜欢什么?

当然我不想在使用有用的方法或函数之前分配对象.那将是痛苦的.

也许厕所鬼是对的.有一个更酷的方式.嗯,对我个人而言,这很棒:

MYNAMESPACECoolMath.h

#import <Foundation/Foundation.h>


@interface MYNAMESPACECoolMath : NSObject {
}

+ (float)randomizeValue:(float)value byPercent:(float)percent;

+ (float)calculateHorizontalGravity:(CGPoint)p1 andPoint:(CGPoint)p2;

// and some more
@end
Run Code Online (Sandbox Code Playgroud)

然后在代码中,我只需导入MYNAMESPACECoolMath.h并调用:

CGFloat myValue = [MYNAMESPACECoolMath randomizeValue:10.0f byPercent:5.0f];

没有讨厌的实例化,初始化,分配,什么永远.对我来说,这个模式在java中看起来像一个静态方法,非常好用且易于使用.

据我所知,功能优于代码的可读性更高.在查看CGRectMake(10.0f,42.5f,44.2f,99.11f)时,您可能需要查看这些参数的含义,如果您对它不熟悉的话.但是当您使用"命名"参数进行方法调用时,您会立即看到参数是什么.

我认为,当谈到可以在任何地方使用的简单有用的方法/功能时,我错过了对单例类产生重大影响的观点.制作特殊类型的随机值不属于任何东西,它是全局的.像草一样.像树一样.像空气一样.每个人都需要它.

iphone cocoa-touch uikit

3
推荐指数
2
解决办法
565
查看次数

Objective-C,需要帮助创建一个AVAudioPlayer单例

我正在开发一个音板应用程序,如果用户希望手动中断剪辑,它有几页按钮可以播放每个页面上有一个停止按钮的声音效果.我在每个视图中使用avaudioplayer按下该剪辑的按钮播放声音.它工作正常,直到视图更改.如果用户跳转到新页面,声音将继续播放,即使停止按钮返回原始视图,停止按钮也会停止工作.按下声音按钮不会中断正在运行的声音,导致两个声音相互重叠.

通过谷歌搜索和搜索这个网站,我知道问题是每个视图更改创建一个新的播放器实例,补救措施是创建一个单例类.不幸的是,我还没有找到如何实际做到这一点的任何进一步的例子.如果有人可以提供或指出创建avaudioplayer单身的初学者指南,我会非常感激.我需要做的就是将文件名传递给共享播放器并开始播放声音剪辑按钮,并且无论用户在哪个视图上,都会停止按钮停止声音.我正在使用带故事板和启用ARC的ios 5.1 sdk.

singleton objective-c avaudioplayer xcode4.2

3
推荐指数
1
解决办法
4490
查看次数